/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package domain;

import common.DomainException;
import java.util.Map;
import common.Observable;
import common.Observer;
import common.ObserverInterest;
import java.util.Set;

/**
 *
 * @author David
 */
public interface DomainFacade extends Observable {

    @Override
    void addObserver(Observer observer, ObserverInterest interest);
    
    @Override
    boolean removeObserver(Observer observer);
    
    void reset();
    
    ArchitectureDTO getArchitecture();
    
    StructureDTO getStructure();
    
    void setArchitectureAuthor(String name) throws DomainException;

    void setArchitectureName(String name) throws DomainException;

    void setStructureAuthor(String name) throws DomainException;

    void setStructureName(String name) throws DomainException;

    String getArchitectureName();

    String getArchitectureAuthor();

    String getStructureName();

    String getStructureAuthor();

    void addLayer(String name, int number) throws DomainException;

    void removeLayer(String name);

    Map<String, Layer> getLayerMap();

    void addUnitToLayer(String unitName, String type, String layerName) throws DomainException;

    void removeUnitFromLayer(String unitName, String unitType, String layerName);

    void addAllowedLayerToLayer(String fromLayer, String toLayer) throws DomainException;

    void removeAllowedLayerForLayer(String deleteLayer, String fromLayer) throws DomainException;
    
    Set<UnitTypeDTO> getUnitTypes();
}
